# pysql_compiler/compiler.py

from .lexer import Lexer
from .parser import Parser
from .planner import Planner
from .catalog import Catalog
from .semantic_analyzer import SemanticAnalyzer

class Compiler:
    """SQL编译器高级接口，整合所有编译步骤"""

    def __init__(self, catalog: Catalog):
        self.catalog = catalog

    def compile(self, sql_string: str) -> tuple[dict, list]:
        """
        将SQL字符串完整编译为查询计划。
        增加了对自定义'SOURCE'命令的处理。
        """
       
        # 在SQL解析前，首先检查是否为自定义的 SOURCE 命令
        stripped_sql = sql_string.strip()
        if stripped_sql.upper().startswith('SOURCE '):
            # 如果是，则解析出文件路径，并生成一个特殊的执行计划
            filepath = stripped_sql[7:].strip()
            if filepath.endswith(';'):
                filepath = filepath[:-1].strip()
            if filepath.startswith("'") and filepath.endswith("'"):
                filepath = filepath[1:-1]
            
            # 返回一个专门给执行器(Executor)看的SOURCE计划
            source_plan = {
                'operation': 'SOURCE',
                'filepath': filepath
            }
            # 因为不是标准SQL，所以返回空的token列表
            return source_plan, []
        

        # 1. 词法分析
        lexer = Lexer(sql_string)
        tokens = list(lexer.tokenize())

        # 2. 语法分析
        parser = Parser(tokens)
        ast = parser.parse()

        # 3. 语义分析
        semantic_analyzer = SemanticAnalyzer(self.catalog)
        semantic_analyzer.analyze(ast)

        # 4. 生成查询计划
        planner = Planner(self.catalog)
        query_plan = planner.create_plan(ast)

        return query_plan, tokens